package main

import (
	"fmt"
	"reflect"

	"github.com/gomodule/redigo/redis"
)

func main() {
	conn, err := redis.Dial("tcp", fmt.Sprintf("%s:%d", "127.0.0.12.9", 6379))
	if err != nil {
		panic(err)
	}

	defer (func() {
		fmt.Println("connection close")
		conn.Close()
	})()

	if false {
		conn.Do("set", "hello", 1)
		rpy, err := redis.Int(conn.Do("get", "hello"))
		if err != nil {
			panic(err)
		}
		fmt.Println(rpy, reflect.TypeOf(rpy))
	}

	if false {
		conn.Do("del", "list")
		vals, err := redis.Strings(conn.Do("brpop",
			redis.Args{}.Add("list").Add(20)...))
		if err != redis.ErrNil {
			fmt.Println(vals, err)
		}
	}

	if false {
		vals, err := redis.StringMap(conn.Do("brpop", redis.Args{}.Add("list").Add(20)...))
		if err != redis.ErrNil {
			fmt.Println(vals, err)
		}
	}

	if false { // redis.Values + redis.Scan
		conn.Do("del", "list")
		conn.Do("lpush", "list", "alen", 100)
		vals, _ := redis.Values(conn.Do("lrange", "list", 0, -1))
		var name string
		var score int
		redis.Scan(vals, &score, &name)
		fmt.Println(name, score)
	}

	if true {
		var p1, p2 struct {
			Name string `redis:"name"`
			Age  string `redis:"age"`
			Sex  string `redis:"sex"`
		}

		p1.Age = "18"
		p1.Name = "alen"
		p1.Sex = "male"

		args1 := redis.Args{}.Add("role:10001").AddFlat(&p1)
		if _, err := conn.Do("hmset", args1...); err != nil {
			fmt.Println(err)
			return
		}

		m := map[string]string{
			"name": "nexora",
			"age":  "20",
			"sex":  "female",
		}
		args2 := redis.Args{}.Add("role:10002").AddFlat(m)
		if _, err := conn.Do("hmset", args2...); err != nil {
			fmt.Println(err)
			return
		}

		for _, id := range []string{"role:10001", "role:10002"} {
			v, err := redis.Values(conn.Do("HGETALL", id))
			if err != nil {
				fmt.Println(err)
				return
			}

			if err := redis.ScanStruct(v, &p2); err != nil {
				fmt.Println(err)
				return
			}

			fmt.Printf("%+v\n", p2)
		}
	}
}
